#include "StaticFFT_Small.h"
#include <xmmintrin.h>
#include "FFTCommon.h"

void StaticFFT_3()
{
	register float TR, TI;
	TR = SFRe[0] + SFRe[1];
	TI = SFIm[0] + SFIm[1];
	SFRe[1] = SFRe[0] - SFRe[1];
	SFIm[1] = SFIm[0] - SFIm[1];
	SFRe[0] = TR; SFIm[0] = TI;
	TR = SFRe[2] + SFRe[3];
	TI = SFIm[2] + SFIm[3];
	SFRe[3] = SFRe[2] - SFRe[3];
	SFIm[3] = SFIm[2] - SFIm[3];
	SFRe[2] = TR; SFIm[2] = TI;
	TR = SFRe[4] + SFRe[5];
	TI = SFIm[4] + SFIm[5];
	SFRe[5] = SFRe[4] - SFRe[5];
	SFIm[5] = SFIm[4] - SFIm[5];
	SFRe[4] = TR; SFIm[4] = TI;
	TR = SFRe[6] + SFRe[7];
	TI = SFIm[6] + SFIm[7];
	SFRe[7] = SFRe[6] - SFRe[7];
	SFIm[7] = SFIm[6] - SFIm[7];
	SFRe[6] = TR; SFIm[6] = TI;
	TR = SFRe[0] + SFRe[2];
	TI = SFIm[0] + SFIm[2];
	SFRe[2] = SFRe[0] - SFRe[2];
	SFIm[2] = SFIm[0] - SFIm[2];
	SFRe[0] = TR; SFIm[0] = TI;
	TR = SFRe[3];
	SFRe[3] =  + SFIm[3];
	SFIm[3] =  - TR;
	TR = SFRe[1]; TI = SFIm[1];
	SFRe[1] += SFRe[3]; SFIm[1] += SFIm[3];
	SFRe[3] = TR - SFRe[3];
	SFIm[3] = TI - SFIm[3];
	TR = SFRe[4] + SFRe[6];
	TI = SFIm[4] + SFIm[6];
	SFRe[6] = SFRe[4] - SFRe[6];
	SFIm[6] = SFIm[4] - SFIm[6];
	SFRe[4] = TR; SFIm[4] = TI;
	TR = SFRe[7];
	SFRe[7] =  + SFIm[7];
	SFIm[7] =  - TR;
	TR = SFRe[5]; TI = SFIm[5];
	SFRe[5] += SFRe[7]; SFIm[5] += SFIm[7];
	SFRe[7] = TR - SFRe[7];
	SFIm[7] = TI - SFIm[7];
	TR = SFRe[0] + SFRe[4];
	TI = SFIm[0] + SFIm[4];
	SFRe[4] = SFRe[0] - SFRe[4];
	SFIm[4] = SFIm[0] - SFIm[4];
	SFRe[0] = TR; SFIm[0] = TI;
	TR = SFRe[5];
	SFRe[5] = SFRe[5] * 0.707106769 + SFIm[5] * 0.707106769;
	SFIm[5] = SFIm[5] * 0.707106769 - TR * 0.707106769;
	TR = SFRe[1]; TI = SFIm[1];
	SFRe[1] += SFRe[5]; SFIm[1] += SFIm[5];
	SFRe[5] = TR - SFRe[5];
	SFIm[5] = TI - SFIm[5];
	TR = SFRe[6];
	SFRe[6] =  + SFIm[6];
	SFIm[6] =  - TR;
	TR = SFRe[2]; TI = SFIm[2];
	SFRe[2] += SFRe[6]; SFIm[2] += SFIm[6];
	SFRe[6] = TR - SFRe[6];
	SFIm[6] = TI - SFIm[6];
	TR = SFRe[7];
	SFRe[7] = SFRe[7] * -0.707106829 + SFIm[7] * 0.707106709;
	SFIm[7] = SFIm[7] * -0.707106829 - TR * 0.707106709;
	TR = SFRe[3]; TI = SFIm[3];
	SFRe[3] += SFRe[7]; SFIm[3] += SFIm[7];
	SFRe[7] = TR - SFRe[7];
	SFIm[7] = TI - SFIm[7];
}

void StaticFFT_4()
{
	register float TR, TI;
	volatile __m128 mRL, mIL;
	__m128 mRF, mIF;
	__m128 mRC, mIC;
	__m128 m0, m1, m2, m3;
	__m128 mI, mR;
	TR = SFRe[0] + SFRe[1];
	TI = SFIm[0] + SFIm[1];
	SFRe[1] = SFRe[0] - SFRe[1];
	SFIm[1] = SFIm[0] - SFIm[1];
	SFRe[0] = TR; SFIm[0] = TI;
	TR = SFRe[2] + SFRe[3];
	TI = SFIm[2] + SFIm[3];
	SFRe[3] = SFRe[2] - SFRe[3];
	SFIm[3] = SFIm[2] - SFIm[3];
	SFRe[2] = TR; SFIm[2] = TI;
	TR = SFRe[4] + SFRe[5];
	TI = SFIm[4] + SFIm[5];
	SFRe[5] = SFRe[4] - SFRe[5];
	SFIm[5] = SFIm[4] - SFIm[5];
	SFRe[4] = TR; SFIm[4] = TI;
	TR = SFRe[6] + SFRe[7];
	TI = SFIm[6] + SFIm[7];
	SFRe[7] = SFRe[6] - SFRe[7];
	SFIm[7] = SFIm[6] - SFIm[7];
	SFRe[6] = TR; SFIm[6] = TI;
	TR = SFRe[8] + SFRe[9];
	TI = SFIm[8] + SFIm[9];
	SFRe[9] = SFRe[8] - SFRe[9];
	SFIm[9] = SFIm[8] - SFIm[9];
	SFRe[8] = TR; SFIm[8] = TI;
	TR = SFRe[10] + SFRe[11];
	TI = SFIm[10] + SFIm[11];
	SFRe[11] = SFRe[10] - SFRe[11];
	SFIm[11] = SFIm[10] - SFIm[11];
	SFRe[10] = TR; SFIm[10] = TI;
	TR = SFRe[12] + SFRe[13];
	TI = SFIm[12] + SFIm[13];
	SFRe[13] = SFRe[12] - SFRe[13];
	SFIm[13] = SFIm[12] - SFIm[13];
	SFRe[12] = TR; SFIm[12] = TI;
	TR = SFRe[14] + SFRe[15];
	TI = SFIm[14] + SFIm[15];
	SFRe[15] = SFRe[14] - SFRe[15];
	SFIm[15] = SFIm[14] - SFIm[15];
	SFRe[14] = TR; SFIm[14] = TI;
	TR = SFRe[0] + SFRe[2];
	TI = SFIm[0] + SFIm[2];
	SFRe[2] = SFRe[0] - SFRe[2];
	SFIm[2] = SFIm[0] - SFIm[2];
	SFRe[0] = TR; SFIm[0] = TI;
	TR = SFRe[3];
	SFRe[3] =  + SFIm[3];
	SFIm[3] =  - TR;
	TR = SFRe[1]; TI = SFIm[1];
	SFRe[1] += SFRe[3]; SFIm[1] += SFIm[3];
	SFRe[3] = TR - SFRe[3];
	SFIm[3] = TI - SFIm[3];
	TR = SFRe[4] + SFRe[6];
	TI = SFIm[4] + SFIm[6];
	SFRe[6] = SFRe[4] - SFRe[6];
	SFIm[6] = SFIm[4] - SFIm[6];
	SFRe[4] = TR; SFIm[4] = TI;
	TR = SFRe[7];
	SFRe[7] =  + SFIm[7];
	SFIm[7] =  - TR;
	TR = SFRe[5]; TI = SFIm[5];
	SFRe[5] += SFRe[7]; SFIm[5] += SFIm[7];
	SFRe[7] = TR - SFRe[7];
	SFIm[7] = TI - SFIm[7];
	TR = SFRe[8] + SFRe[10];
	TI = SFIm[8] + SFIm[10];
	SFRe[10] = SFRe[8] - SFRe[10];
	SFIm[10] = SFIm[8] - SFIm[10];
	SFRe[8] = TR; SFIm[8] = TI;
	TR = SFRe[11];
	SFRe[11] =  + SFIm[11];
	SFIm[11] =  - TR;
	TR = SFRe[9]; TI = SFIm[9];
	SFRe[9] += SFRe[11]; SFIm[9] += SFIm[11];
	SFRe[11] = TR - SFRe[11];
	SFIm[11] = TI - SFIm[11];
	TR = SFRe[12] + SFRe[14];
	TI = SFIm[12] + SFIm[14];
	SFRe[14] = SFRe[12] - SFRe[14];
	SFIm[14] = SFIm[12] - SFIm[14];
	SFRe[12] = TR; SFIm[12] = TI;
	TR = SFRe[15];
	SFRe[15] =  + SFIm[15];
	SFIm[15] =  - TR;
	TR = SFRe[13]; TI = SFIm[13];
	SFRe[13] += SFRe[15]; SFIm[13] += SFIm[15];
	SFRe[15] = TR - SFRe[15];
	SFIm[15] = TI - SFIm[15];
	TR = SFRe[0] + SFRe[4];
	TI = SFIm[0] + SFIm[4];
	SFRe[4] = SFRe[0] - SFRe[4];
	SFIm[4] = SFIm[0] - SFIm[4];
	SFRe[0] = TR; SFIm[0] = TI;
	TR = SFRe[5];
	SFRe[5] = SFRe[5] * 0.707106769 + SFIm[5] * 0.707106769;
	SFIm[5] = SFIm[5] * 0.707106769 - TR * 0.707106769;
	TR = SFRe[1]; TI = SFIm[1];
	SFRe[1] += SFRe[5]; SFIm[1] += SFIm[5];
	SFRe[5] = TR - SFRe[5];
	SFIm[5] = TI - SFIm[5];
	TR = SFRe[6];
	SFRe[6] =  + SFIm[6];
	SFIm[6] =  - TR;
	TR = SFRe[2]; TI = SFIm[2];
	SFRe[2] += SFRe[6]; SFIm[2] += SFIm[6];
	SFRe[6] = TR - SFRe[6];
	SFIm[6] = TI - SFIm[6];
	TR = SFRe[7];
	SFRe[7] = SFRe[7] * -0.707106829 + SFIm[7] * 0.707106709;
	SFIm[7] = SFIm[7] * -0.707106829 - TR * 0.707106709;
	TR = SFRe[3]; TI = SFIm[3];
	SFRe[3] += SFRe[7]; SFIm[3] += SFIm[7];
	SFRe[7] = TR - SFRe[7];
	SFIm[7] = TI - SFIm[7];
	TR = SFRe[8] + SFRe[12];
	TI = SFIm[8] + SFIm[12];
	SFRe[12] = SFRe[8] - SFRe[12];
	SFIm[12] = SFIm[8] - SFIm[12];
	SFRe[8] = TR; SFIm[8] = TI;
	TR = SFRe[13];
	SFRe[13] = SFRe[13] * 0.707106769 + SFIm[13] * 0.707106769;
	SFIm[13] = SFIm[13] * 0.707106769 - TR * 0.707106769;
	TR = SFRe[9]; TI = SFIm[9];
	SFRe[9] += SFRe[13]; SFIm[9] += SFIm[13];
	SFRe[13] = TR - SFRe[13];
	SFIm[13] = TI - SFIm[13];
	TR = SFRe[14];
	SFRe[14] =  + SFIm[14];
	SFIm[14] =  - TR;
	TR = SFRe[10]; TI = SFIm[10];
	SFRe[10] += SFRe[14]; SFIm[10] += SFIm[14];
	SFRe[14] = TR - SFRe[14];
	SFIm[14] = TI - SFIm[14];
	TR = SFRe[15];
	SFRe[15] = SFRe[15] * -0.707106829 + SFIm[15] * 0.707106709;
	SFIm[15] = SFIm[15] * -0.707106829 - TR * 0.707106709;
	TR = SFRe[11]; TI = SFIm[11];
	SFRe[11] += SFRe[15]; SFIm[11] += SFIm[15];
	SFRe[15] = TR - SFRe[15];
	SFIm[15] = TI - SFIm[15];
	TR = SFRe[0] + SFRe[8];
	TI = SFIm[0] + SFIm[8];
	SFRe[8] = SFRe[0] - SFRe[8];
	SFIm[8] = SFIm[0] - SFIm[8];
	SFRe[0] = TR; SFIm[0] = TI;
	TR = SFRe[9];
	SFRe[9] = SFRe[9] * 0.923879504 + SFIm[9] * 0.382683456;
	SFIm[9] = SFIm[9] * 0.923879504 - TR * 0.382683456;
	TR = SFRe[1]; TI = SFIm[1];
	SFRe[1] += SFRe[9]; SFIm[1] += SFIm[9];
	SFRe[9] = TR - SFRe[9];
	SFIm[9] = TI - SFIm[9];
	TR = SFRe[10];
	SFRe[10] = SFRe[10] * 0.707106769 + SFIm[10] * 0.707106769;
	SFIm[10] = SFIm[10] * 0.707106769 - TR * 0.707106769;
	TR = SFRe[2]; TI = SFIm[2];
	SFRe[2] += SFRe[10]; SFIm[2] += SFIm[10];
	SFRe[10] = TR - SFRe[10];
	SFIm[10] = TI - SFIm[10];
	TR = SFRe[11];
	SFRe[11] = SFRe[11] * 0.382683396 + SFIm[11] * 0.923879564;
	SFIm[11] = SFIm[11] * 0.382683396 - TR * 0.923879564;
	TR = SFRe[3]; TI = SFIm[3];
	SFRe[3] += SFRe[11]; SFIm[3] += SFIm[11];
	SFRe[11] = TR - SFRe[11];
	SFIm[11] = TI - SFIm[11];
	mRL = _mm_load_ps(SFRe + 12);
	mIL = _mm_load_ps(SFIm + 12);
	mR = mRL;
	mI = mIL;
	mRF = _mm_set_ps(-0.923879562, -0.707106828, -0.382683483, -0.000000044);
	mIF = _mm_set_ps(-0.382683362, -0.707106735, -0.923879512, -1.000000000);
	m0 = _mm_mul_ps(mR, mRF);
	m1 = _mm_mul_ps(mI, mIF);
	m2 = _mm_mul_ps(mI, mRF);
	m3 = _mm_mul_ps(mR, mIF);
	mR = _mm_sub_ps(m0, m1);
	mI = _mm_add_ps(m2, m3);
	mRC = _mm_load_ps(SFRe + 4);
	mIC = _mm_load_ps(SFIm + 4);
	m0 = mRC; m1 = mIC;
	mRC = _mm_add_ps(mRC, mR);
	mIC = _mm_add_ps(mIC, mI);
	_mm_store_ps(SFRe + 4, mRC);
	_mm_store_ps(SFIm + 4, mIC);
	m0 = _mm_sub_ps(m0, mR);
	m1 = _mm_sub_ps(m1, mI);
	_mm_store_ps(SFRe + 12, m0);
	_mm_store_ps(SFIm + 12, m1);
}
